package com.itheima.stock.service.impl;


import com.itheima.stock.cache.Cache;
import com.itheima.stock.constant.Constants;
import com.itheima.stock.dto.LoginDTO;
import com.itheima.stock.entity.SysUser;
import com.itheima.stock.enums.CodeEnum;
import com.itheima.stock.exception.Exceptions;
import com.itheima.stock.mapper.SysUserMapper;
import com.itheima.stock.service.UserService;
import com.itheima.stock.util.IdWorkers;
import com.itheima.stock.util.RedisKeyUtil;
import com.itheima.stock.vo.CaptchaVO;
import com.itheima.stock.vo.LoginVO;
import org.apache.commons.lang3.RandomStringUtils;

import org.apache.commons.lang3.StringUtils;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.Id;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private IdWorkers idWorkers;
    @Autowired
    private Cache redisCache;
    @Autowired
    private PasswordEncoder passwordEncoder;

    private static final  int FOUR = 4;
    @Autowired
    private SysUserMapper sysUserMapper;


    @Override
    public CaptchaVO captcha() {
        //1.生成随机4位验证码
        String captcha = RandomStringUtils.randomNumeric(FOUR);
        //2.将验证码存储到Redis
        //2.1 生成Redis的key
        String redisKey = RedisKeyUtil.GenerKey(Constants.CAPTCHA_PREFIX,idWorkers.nextStrId());
        redisCache.set(redisKey,captcha,Constants.CAPTCHA_EXPIRE_TIME);
        return CaptchaVO.builder()
                .rkey(redisKey)
                .code(captcha)
                .build();
    }

    @Override
    public LoginVO login(LoginDTO dto) {
        if (ObjectUtils.isEmpty(dto)
                || ObjectUtils.isEmpty(dto.getUsername())
                || ObjectUtils.isEmpty(dto.getPassword())
                || ObjectUtils.isEmpty(dto.getCode())
                || ObjectUtils.isEmpty(dto.getRkey())){
            Exceptions.cast(CodeEnum.PARAM_IS_NOT_NUll);
        }
        String s = dto.getRkey();
        String captchaInRedis = redisCache.get(s);
        System.out.println(captchaInRedis);
        if (!StringUtils.equals(captchaInRedis,dto.getCode())){
            Exceptions.cast(CodeEnum.SYSTEM_VERIFY_CODE_ERROR);
        }
        SysUser user = sysUserMapper.selectByUsername(dto.getUsername(),Constants.SYS_USER_STATUS_NORMAL,Constants.SYS_USER_UN_DELET);
        if (ObjectUtils.isEmpty(user) || !passwordEncoder.matches(dto.getPassword(),user.getPassword)){
            Exceptions.cast(CodeEnum.SYSTEM_USERNAME_NOT_EXISTS);
        }
        return LoginVO.builder()
                .id(user.getId())
                .username(user.getUsername())
                .nickName(user.getNickName())
                .phone(user.getPhone())
                .build();







    }
}
